package indi.lqzhi.basic.tools.socket;

import androidx.annotation.Nullable;

public interface ISocketClient {

    /************************** 监听器接口区 **********************************/

    /**
     * 回调监听器,处理byte[]字节的数据
     */
    public interface OnResponseLinstener {
        /**
         * 处理接收到的数据的回调，执行在UI线程中
         *
         * @param socketClient socket客户端
         * @param response 接收到的数据
         */
        void onResponse(SocketClient socketClient, byte[] response);

        /**
         * 默认在主线程中进行
         * @return true 主线程执行 false 子线程执行
         */
        default boolean isMainThread(){
            return true;
        }
    }

    /**
     * 回调监听器,处理字符串的数据
     */
    public interface OnResponseDataLinstener {
        /**
         * 处理接收到的数据的回调，执行在UI线程中
         *
         * @param socketClient socket客户端
         * @param response 接收到的数据，根据recvCharset进行编码
         */
        void onResponse(SocketClient socketClient,String response);

        /**
         * 默认在主线程中进行
         * @return true 主线程执行 false 子线程执行
         */
        default boolean isMainThread(){
            return true;
        }
    }

    /**
     * 监听连接的监听器，用于当Socket断开连接后的监听器
     */
    public interface OnDisConnectLinstener{

        /**
         * 处理当断开连接后的回调
         *
         * @param throwable 造成断开连接的异常，可能为空
         */
        void onDisConnect(@Nullable Throwable throwable);


        /**
         * 默认在主线程中进行
         * @return true 主线程执行 false 子线程执行
         */
        default boolean isMainThread(){
            return true;
        }
    }

    /**
     * 连接监听器,用于当发起Socket请求时,回调的连接成功，或者连接失败的监听器
     */
    public interface OnConnectLinstener{

        /**
         * 连接成功回调，执行在UI线程中
         *
         * @param socketClient 当前的socket客户端
         */
        default void onConnectSuccess(SocketClient socketClient) {

        }

        /**
         * 连接失败回调，执行在UI线程中
         *
         * @param socketClient   当前的socket客户端
         * @param throwable      造成的异常
         */
        default void onConnectFail(SocketClient socketClient, Throwable throwable) {

        }

        /**
         * 默认在主线程中进行
         * @return true 主线程执行 false 子线程执行
         */
        default boolean isMainThread(){
            return true;
        }

    }

}
